package com.xmg.p2p.business.service;

import com.xmg.p2p.base.domain.Userinfo;
import com.xmg.p2p.base.query.PageResult;
import com.xmg.p2p.business.domain.BidRequest;
import com.xmg.p2p.business.domain.BidRequestAuditHistory;
import com.xmg.p2p.business.query.BidRequestQueryObject;
import com.xmg.p2p.business.query.PaymentScheduleQueryObject;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;
import java.util.List;

/**
 * 借款相关的服务
 *
 */

public interface IBidRequestService {

    /**
     * 乐观锁的控制
     * @param bidRequest
     */
    void update(BidRequest bidRequest) ;

    /*
     * 判断当前用户是否可以申请借款
     */
    boolean canApply(Userinfo userinfo);

    /**
     * 进行添加 发标 操作
     * @param bidRequest
     */
    void apply(BidRequest bidRequest);

    //根据条件查询对应的发标审核(分页操作)
    PageResult query(BidRequestQueryObject qo);

    /**
     * 后台借款的审核流程
     * @param id
     * @param remark
     * @param state
     */
    void publishAudit(Long id, String remark, int state);

    /**
     * 通过编号获取贷款对象
     * @param id
     * @return
     */
    BidRequest getById(Long id);

    /**
     * 查看明细时候    查询一个借款相关的所有审核对象
     * @param id
     * @return
     */
    List<BidRequestAuditHistory> listAuditHistorayByBidRequest(Long id);

    /**
     * 根据条件查询借款标的列表
     * @param qo
     * @return
     */
    List<BidRequest> queryForList(BidRequestQueryObject qo);


    /**
     * 投标业务
     * @param bidRequestId  借款对象的ID（关联借款）
     * @param amount    投标的金额
     */
    void bid(Long bidRequestId, BigDecimal amount);

    /**
     * 执行一审的业务
     * @param id    要执行的标的ID
     * @param remark    一审通过或失败的备注信息
     * @param state     通过或失败的状态
     */
    void fullAudit1(Long id, String remark, int state);

    /**
     * 执行二审的操作
     * @param id    要操作的标的ID
     * @param remark    审核的备注信息
     * @param state     审核状态
     */
    void fullAudit2(Long id, String remark, int state);

    /**
     * 还款列表
     * @param qo    条件
     * @return  分页的封装
     */
    PageResult queryForPaymentSchedule(PaymentScheduleQueryObject qo);

    /**
     * 进行还款
     * @param id 要进行还款的借款标的ID
     */
    void returnMoney(Long id);
}